package com.example.user_manage.controller;

import com.example.user_manage.dto.UserRequestDTO;
import com.example.user_manage.dto.UserResponseDTO;
import com.example.user_manage.entity.User;
import com.example.user_manage.enums.REnum;
import com.example.user_manage.result.R;
import com.example.user_manage.service.UserService;
import com.example.user_manage.util.EntityOrDTOUtil;
import com.github.pagehelper.PageInfo;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 用户控制器，负责调用与用户相关的服务
 */
@Controller
@AllArgsConstructor
@Validated
public class UserController {

    /**
     * 用户服务对象
     */
    private final UserService userService;

    /**
     * 注册用户
     * @param userRequestDTO 前端传来的用户数据
     * @return 结果封装对象
     */
    @PostMapping("/mySignIn")
    public @ResponseBody R<Void> signInUser(
            @RequestBody UserRequestDTO userRequestDTO) {
        //调用插入用户服务
        userService.insertUser(userRequestDTO);
        //返回注册成功结果
        return R.ok(REnum.SUCCESS_SIGN_IN);
    }

    /**
     * 修改用户数据
     * @param userRequestDTO 请求携带的用户数据对象
     * @return 结果封装对象
     */
    @PutMapping("/updateUser")
    public @ResponseBody R<Void> updateUserByUserId(
            @RequestBody UserRequestDTO userRequestDTO){
        //调用修改用户信息服务
        userService.updateUserByUserId(userRequestDTO);
        //返回修改成功结果
        return R.ok(REnum.SUCCESS_USER_UPDATE);
    }

    /**
     * 删除用户，通过用户id
     * @param id 用户id号
     * @return 结果封装对象
     */
    @DeleteMapping("/delete")
    public @ResponseBody R<Void> deleteUserByUserId(@RequestParam Long id){
        //调用删除用户服务
        userService.deleteUserByUserId(id);
        //返回删除结果
        return R.ok(REnum.SUCCESS_USER_DELETE);
    }

    /**
     * 创建用户已角色对应关系
     * @param userId 用户id
     * @param roleId 角色id
     * @return 结果封装对象
     */
    @PostMapping("/insert/tUserRole")
    public @ResponseBody R<Void> insertTUserRole(@RequestParam Long userId, @RequestParam Long roleId){
        //调用用户服务对象，插入新的用户角色对应关系
        userService.insertUserRole(userId, roleId);
        return R.ok(REnum.SUCCESS_CREATE_USER_ROLE);
    }

    /**
     * 删除用户角色对应关系
     * @param userId 用户id
     * @param roleId 角色id
     * @return 结果封装对象
     */
    @DeleteMapping("/delete/tUserRole")
    public @ResponseBody R<Void> deleteTUserRole(@RequestParam Long userId, @RequestParam Long roleId){
        //调用用户服务对象删除用户角色对应关系
        userService.deleteUserRole(userId, roleId);
        return R.ok(REnum.SUCCESS_DELETE_USER_ROLE);
    }

    /**
     * 获取拥有该角色id的用户列表
     * @param roleId 角色id
     * @param pageNum 当前所在页面
     * @param pageSize 每页展示页数
     * @return 结果封装对象
     */
    @GetMapping("/getUsersByRoleId")
    public @ResponseBody R<PageInfo<UserResponseDTO>> getUsersByRoleId(
            @RequestParam long roleId,
            @RequestParam int pageNum,
            @RequestParam int pageSize){

        //通过查询，获取用户信息列表。
        PageInfo<User> pageInfo = userService.selectUsersByRoleId(roleId, pageNum, pageSize);
        //将User对象全部转换成DTO对象
        List<UserResponseDTO> userResponseDTOs = pageInfo.getList().stream()
                .map(EntityOrDTOUtil::toUserResponseDTO)
                .collect(Collectors.toList());

        // 创建新的PageInfo用于盛放用户响应DTO对象
        PageInfo<UserResponseDTO> result = new PageInfo<>(userResponseDTOs);
        //将老的页面统计复制过来
        result.setTotal(pageInfo.getTotal());
        return R.ok(REnum.SUCCESS_SELECT_USERS,result);
    }
}
